// 导入 express 模块
const express = require('express')
// 创建 express 的服务器实例
const app = express()
const port = 8000
const Joi = require('joi')
// 引入bodyParser
// 配置之后可以req.body接收json数据了
var bodyParser = require('body-parser')
// 配置cors跨域
const cors = require('cors')
// 托管静态资源文件
app.use('/uploads', express.static('./uploads'))
app.use(cors())

// 配置解析 application/x-www-form-urlencoded 格式的表单数据的中间件
app.use(express.urlencoded({extended:false}))
app.use(bodyParser.urlencoded({ extended: false }))

// 一定要在路由之前，封装res.cc函数
app.use(function(req,res,next){
    // status的值默认为1，表示失败
    res.cc = function(err,status = 1){
        res.send({
            status,
            message: err instanceof Error ? err.message : err
        })
    }
    next()
})
// 一定要在路由之前，配置解析Token的中间件
const expressJwt = require('express-jwt')
const config = require('./config')

app.use(expressJwt({secret:config.jwtSecretKey,algorithms:["HS256"]}).unless({path: [/^\/api/]}))
// 一定要在路由之前,解决请求体过大传不过来的问题
app.use(bodyParser.json({limit:'6mb'})); 
app.use(bodyParser.urlencoded({ limit:'600mb'}))

// 导入并注册路由
const userRouter = require("./router/user")
app.use('/api',userRouter)
const userinfoRouter = require("./router/userinfo")
app.use('/my',userinfoRouter)
const artCateRouter  = require("./router/artcate")
app.use('/my/cate',artCateRouter)


// 在路由之后定义错误级别的中间件
app.use(function(err,req,res,next){
    // 验证失败导致的错误
    if(err instanceof Joi.ValidationError){
        return res.cc(err)
    }
    // 身份认证失败的错误
    if(err.name === 'UnauthorizedError') return res.status(401).send('身份认证失败')
    // 未知的错误
    res.cc(err)
})

app.listen(port, () => console.log(`Example app listening on port ${port}!`))